Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

app/src/main/java/com/geeksville/mesh/ui/Main.kt 78274c792318331b11ab64cd28e58e829875b8c2 (78274c79) Text, 25.73 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMatchingDeclarationNameTa5d6ff"Tb4b4b4)

Tff7b72package T7ee787com.geeksville.mesh.ui

Tff7b72import T7ee787android.Manifest
Tff7b72import T7ee787android.os.Build
Tff7b72import T7ee787androidx.compose.animation.AnimatedVisibility
Tff7b72import T7ee787androidx.compose.animation.core.Animatable
Tff7b72import T7ee787androidx.compose.animation.core.LinearEasing
Tff7b72import T7ee787androidx.compose.animation.core.tween
Tff7b72import T7ee787androidx.compose.animation.fadeIn
Tff7b72import T7ee787androidx.compose.animation.fadeOut
Tff7b72import T7ee787androidx.compose.animation.scaleIn
Tff7b72import T7ee787androidx.compose.animation.scaleOut
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.imePadding
Tff7b72import T7ee787androidx.compose.foundation.layout.recalculateWindowInsets
Tff7b72import T7ee787androidx.compose.foundation.layout.safeDrawingPadding
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.verticalScroll
Tff7b72import T7ee787androidx.compose.material.icons.Icons
Tff7b72import T7ee787androidx.compose.material.icons.rounded.Wifi
Tff7b72import T7ee787androidx.compose.material3.Badge
Tff7b72import T7ee787androidx.compose.material3.BadgedBox
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3Api
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.LocalContentColor
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme.colorScheme
Tff7b72import T7ee787androidx.compose.material3.PlainTooltip
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TooltipAnchorPosition
Tff7b72import T7ee787androidx.compose.material3.TooltipBox
Tff7b72import T7ee787androidx.compose.material3.TooltipDefaults
Tff7b72import T7ee787androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
Tff7b72import T7ee787androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteScaffold
Tff7b72import T7ee787androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteScaffoldDefaults
Tff7b72import T7ee787androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType
Tff7b72import T7ee787androidx.compose.material3.rememberTooltipState
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.livedata.observeAsState
Tff7b72import T7ee787androidx.compose.runtime.mutableIntStateOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberCoroutineScope
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.draw.drawWithCache
Tff7b72import T7ee787androidx.compose.ui.graphics.BlendMode
Tff7b72import T7ee787androidx.compose.ui.graphics.Brush
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.graphics.vector.ImageVector
Tff7b72import T7ee787androidx.compose.ui.platform.LocalContext
Tff7b72import T7ee787androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787androidx.navigation.NavDestination
Tff7b72import T7ee787androidx.navigation.NavDestination.Companion.hasRoute
Tff7b72import T7ee787androidx.navigation.NavDestination.Companion.hierarchy
Tff7b72import T7ee787androidx.navigation.NavGraph.Companion.findStartDestination
Tff7b72import T7ee787androidx.navigation.compose.NavHost
Tff7b72import T7ee787androidx.navigation.compose.currentBackStackEntryAsState
Tff7b72import T7ee787androidx.navigation.compose.rememberNavController
Tff7b72import T7ee787com.geeksville.mesh.BuildConfig
Tff7b72import T7ee787com.geeksville.mesh.model.BTScanModel
Tff7b72import T7ee787com.geeksville.mesh.model.UIViewModel
Tff7b72import T7ee787com.geeksville.mesh.navigation.channelsGraph
Tff7b72import T7ee787com.geeksville.mesh.navigation.connectionsGraph
Tff7b72import T7ee787com.geeksville.mesh.navigation.contactsGraph
Tff7b72import T7ee787com.geeksville.mesh.navigation.firmwareGraph
Tff7b72import T7ee787com.geeksville.mesh.navigation.mapGraph
Tff7b72import T7ee787com.geeksville.mesh.navigation.nodesGraph
Tff7b72import T7ee787com.geeksville.mesh.navigation.settingsGraph
Tff7b72import T7ee787com.geeksville.mesh.repository.radio.MeshActivity
Tff7b72import T7ee787com.geeksville.mesh.service.MeshService
Tff7b72import T7ee787com.geeksville.mesh.ui.connections.DeviceType
Tff7b72import T7ee787com.geeksville.mesh.ui.connections.components.ConnectionsNavIcon
Tff7b72import T7ee787com.google.accompanist.permissions.ExperimentalPermissionsApi
Tff7b72import T7ee787com.google.accompanist.permissions.isGranted
Tff7b72import T7ee787com.google.accompanist.permissions.rememberPermissionState
Tff7b72import T7ee787kotlinx.coroutines.flow.collectLatest
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.jetbrains.compose.resources.StringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.getString
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.model.DeviceVersion
Tff7b72import T7ee787org.meshtastic.core.navigation.ConnectionsRoutes
Tff7b72import T7ee787org.meshtastic.core.navigation.ContactsRoutes
Tff7b72import T7ee787org.meshtastic.core.navigation.MapRoutes
Tff7b72import T7ee787org.meshtastic.core.navigation.NodesRoutes
Tff7b72import T7ee787org.meshtastic.core.navigation.Route
Tff7b72import T7ee787org.meshtastic.core.navigation.SettingsRoutes
Tff7b72import T7ee787org.meshtastic.core.service.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.strings.Res
Tff7b72import T7ee787org.meshtastic.core.strings.app_too_old
Tff7b72import T7ee787org.meshtastic.core.strings.bottom_nav_settings
Tff7b72import T7ee787org.meshtastic.core.strings.client_notification
Tff7b72import T7ee787org.meshtastic.core.strings.compromised_keys
Tff7b72import T7ee787org.meshtastic.core.strings.connected
Tff7b72import T7ee787org.meshtastic.core.strings.connecting
Tff7b72import T7ee787org.meshtastic.core.strings.connections
Tff7b72import T7ee787org.meshtastic.core.strings.conversations
Tff7b72import T7ee787org.meshtastic.core.strings.device_sleeping
Tff7b72import T7ee787org.meshtastic.core.strings.disconnected
Tff7b72import T7ee787org.meshtastic.core.strings.firmware_old
Tff7b72import T7ee787org.meshtastic.core.strings.firmware_too_old
Tff7b72import T7ee787org.meshtastic.core.strings.map
Tff7b72import T7ee787org.meshtastic.core.strings.must_update
Tff7b72import T7ee787org.meshtastic.core.strings.nodes
Tff7b72import T7ee787org.meshtastic.core.strings.okay
Tff7b72import T7ee787org.meshtastic.core.strings.should_update
Tff7b72import T7ee787org.meshtastic.core.strings.should_update_firmware
Tff7b72import T7ee787org.meshtastic.core.strings.traceroute
Tff7b72import T7ee787org.meshtastic.core.ui.component.MultipleChoiceAlertDialog
Tff7b72import T7ee787org.meshtastic.core.ui.component.ScrollToTopEvent
Tff7b72import T7ee787org.meshtastic.core.ui.component.SimpleAlertDialog
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Conversations
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Map
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Nodes
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Settings
Tff7b72import T7ee787org.meshtastic.core.ui.qr.ScannedQrCodeDialog
Tff7b72import T7ee787org.meshtastic.core.ui.share.SharedContactDialog
Tff7b72import T7ee787org.meshtastic.core.ui.theme.StatusColors.StatusBlue
Tff7b72import T7ee787org.meshtastic.core.ui.theme.StatusColors.StatusGreen
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.annotateTraceroute
Tff7b72import T7ee787org.meshtastic.proto.MeshProtos
Tff7b72import T7ee787timber.log.Timber

Tff7b72enum Tff7b72class T56d364TopLevelDestinationTb4b4b4(Tff7b72val Te6edf3labelTb4b4b4: Te6edf3StringResourceTb4b4b4, Tff7b72val Te6edf3iconTb4b4b4: Te6edf3ImageVectorTb4b4b4, Tff7b72val Te6edf3routeTb4b4b4: Te6edf3RouteTb4b4b4) Tb4b4b4{
Te6edf3ConversationsTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3conversationsTb4b4b4, Te6edf3MeshtasticIconsTb4b4b4.Te6edf3ConversationsTb4b4b4, Te6edf3ContactsRoutesTb4b4b4.Te6edf3ContactsGraphTb4b4b4)Tb4b4b4,
Te6edf3NodesTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3nodesTb4b4b4, Te6edf3MeshtasticIconsTb4b4b4.Te6edf3NodesTb4b4b4, Te6edf3NodesRoutesTb4b4b4.Te6edf3NodesGraphTb4b4b4)Tb4b4b4,
Te6edf3MapTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mapTb4b4b4, Te6edf3MeshtasticIconsTb4b4b4.Te6edf3MapTb4b4b4, Te6edf3MapRoutesTb4b4b4.Te6edf3MapTb4b4b4)Tb4b4b4,
Te6edf3SettingsTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3bottom_nav_settingsTb4b4b4, Te6edf3MeshtasticIconsTb4b4b4.Te6edf3SettingsTb4b4b4, Te6edf3SettingsRoutesTb4b4b4.Te6edf3SettingsGraphTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3ConnectionsTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connectionsTb4b4b4, Te6edf3IconsTb4b4b4.Te6edf3RoundedTb4b4b4.Te6edf3WifiTb4b4b4, Te6edf3ConnectionsRoutesTb4b4b4.Te6edf3ConnectionsGraphTb4b4b4)Tb4b4b4,
Tb4b4b4;

Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72fun Td2a8fffromNavDestinationTb4b4b4(Te6edf3destinationTb4b4b4: Te6edf3NavDestination?Tb4b4b4)Tb4b4b4: Te6edf3TopLevelDestination? Tff7b72=
Te6edf3entriesTb4b4b4.Te6edf3find Tb4b4b4{ Te6edf3dest Tff7b72-Tff7b72> Te6edf3destinationTff7b72?.Te6edf3hierarchyTff7b72?.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3hasRouteTb4b4b4(Te6edf3destTb4b4b4.Te6edf3routeTff7b72::Te6edf3classTb4b4b4) Tb4b4b4} Tff7b72=Tff7b72= Tff7b72true Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4, Te6edf3ExperimentalPermissionsApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffMainScreenTb4b4b4(Te6edf3uIViewModelTb4b4b4: Te6edf3UIViewModel Tff7b72= Te6edf3hiltViewModelTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3scanModelTb4b4b4: Te6edf3BTScanModel Tff7b72= Te6edf3hiltViewModelTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3navController Tff7b72= Te6edf3rememberNavControllerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3connectionState Tff7b72by Te6edf3uIViewModelTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3requestChannelSet Tff7b72by Te6edf3uIViewModelTb4b4b4.Te6edf3requestChannelSetTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3sharedContactRequested Tff7b72by Te6edf3uIViewModelTb4b4b4.Te6edf3sharedContactRequestedTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3unreadMessageCount Tff7b72by Te6edf3uIViewModelTb4b4b4.Te6edf3unreadMessageCountTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72>Tff7b72= Te6edf3BuildTb4b4b4.Te6edf3VERSION_CODESTb4b4b4.Te6edf3TIRAMISUTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3notificationPermissionState Tff7b72= Te6edf3rememberPermissionStateTb4b4b4(Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3POST_NOTIFICATIONSTb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Te6edf3connectionStateTb4b4b4, Te6edf3notificationPermissionStateTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3connectionState Tff7b72=Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected Tff7b72&Tff7b72& Tff7b72!Te6edf3notificationPermissionStateTb4b4b4.Te6edf3statusTb4b4b4.Te6edf3isGrantedTb4b4b4) Tb4b4b4{
Te6edf3notificationPermissionStateTb4b4b4.Te6edf3launchPermissionRequestTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3connectionState Tff7b72=Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4{
Te6edf3sharedContactRequestedTff7b72?.Te6edf3let Tb4b4b4{
Te6edf3SharedContactDialogTb4b4b4(Te6edf3sharedContact Tff7b72= Tffa657itTb4b4b4, Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3uIViewModelTb4b4b4.Te6edf3clearSharedContactRequestedTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)
Tb4b4b4}

Te6edf3requestChannelSetTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3newChannelSet Tff7b72-Tff7b72>
Te6edf3ScannedQrCodeDialogTb4b4b4(Te6edf3newChannelSetTb4b4b4, Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3uIViewModelTb4b4b4.Te6edf3clearRequestChannelUrlTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3uIViewModelTb4b4b4.Te6edf3AddNavigationTrackingEffectTb4b4b4(Te6edf3navControllerTb4b4b4)

Te6edf3VersionChecksTb4b4b4(Te6edf3uIViewModelTb4b4b4)
Tff7b72val Te6edf3alertDialogState Tff7b72by Te6edf3uIViewModelTb4b4b4.Te6edf3currentAlertTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Te6edf3alertDialogStateTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3choicesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MultipleChoiceAlertDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stateTb4b4b4.Te6edf3titleTb4b4b4,
Te6edf3message Tff7b72= Te6edf3stateTb4b4b4.Te6edf3messageTb4b4b4,
Te6edf3choices Tff7b72= Te6edf3stateTb4b4b4.Te6edf3choicesTb4b4b4,
Te6edf3onDismissRequest Tff7b72= Tb4b4b4{ Te6edf3stateTb4b4b4.Te6edf3onDismissTff7b72?.Te6edf3let Tb4b4b4{ Tffa657itTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3SimpleAlertDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stateTb4b4b4.Te6edf3titleTb4b4b4,
Te6edf3message Tff7b72= Te6edf3stateTb4b4b4.Te6edf3messageTb4b4b4,
Te6edf3html Tff7b72= Te6edf3stateTb4b4b4.Te6edf3htmlTb4b4b4,
Te6edf3onConfirmRequest Tff7b72= Tb4b4b4{ Te6edf3stateTb4b4b4.Te6edf3onConfirmTff7b72?.Te6edf3let Tb4b4b4{ Tffa657itTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3onDismissRequest Tff7b72= Tb4b4b4{ Te6edf3stateTb4b4b4.Te6edf3onDismissTff7b72?.Te6edf3let Tb4b4b4{ Tffa657itTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3clientNotification Tff7b72by Te6edf3uIViewModelTb4b4b4.Te6edf3clientNotificationTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Te6edf3clientNotificationTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3notification Tff7b72-Tff7b72>
Tff7b72var Te6edf3message Tff7b72= Te6edf3notificationTb4b4b4.Te6edf3message
Tff7b72val Te6edf3compromisedKeys Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3notificationTb4b4b4.Te6edf3hasLowEntropyKeyTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3notificationTb4b4b4.Te6edf3hasDuplicatedPublicKeyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3message Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3compromised_keysTb4b4b4)
Tff7b72true
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72false
Tb4b4b4}
Te6edf3SimpleAlertDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3client_notificationTb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3messageTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3compromisedKeysTb4b4b4) Tb4b4b4{
Te6edf3navControllerTb4b4b4.Te6edf3navigateTb4b4b4(Te6edf3SettingsRoutesTb4b4b4.Te6edf3SecurityTb4b4b4)
Tb4b4b4}
Te6edf3uIViewModelTb4b4b4.Te6edf3clearClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3uIViewModelTb4b4b4.Te6edf3clearClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3traceRouteResponse Tff7b72by Te6edf3uIViewModelTb4b4b4.Te6edf3tracerouteResponseTb4b4b4.Te6edf3observeAsStateTb4b4b4(Tb4b4b4)
Te6edf3traceRouteResponseTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3response Tff7b72-Tff7b72>
Te6edf3SimpleAlertDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3tracerouteTb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3annotateTracerouteTb4b4b4(Te6edf3responseTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3dismissText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3okayTb4b4b4)Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3uIViewModelTb4b4b4.Te6edf3clearTracerouteResponseTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3navSuiteType Tff7b72= Te6edf3NavigationSuiteScaffoldDefaultsTb4b4b4.Te6edf3navigationSuiteTypeTb4b4b4(Te6edf3currentWindowAdaptiveInfoTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3currentDestination Tff7b72= Te6edf3navControllerTb4b4b4.Te6edf3currentBackStackEntryAsStateTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3valueTff7b72?.Te6edf3destination
Tff7b72val Te6edf3topLevelDestination Tff7b72= Te6edf3TopLevelDestinationTb4b4b4.Te6edf3fromNavDestinationTb4b4b4(Te6edf3currentDestinationTb4b4b4)

T8b949e// State for determining the connection type icon to display
Tff7b72val Te6edf3selectedDevice Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3selectedNotNullFlowTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)

T8b949e// State for managing the glow animation around the Connections icon
Tff7b72var Te6edf3currentGlowColor Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Te6edf3ColorTb4b4b4.Te6edf3TransparentTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3animatedGlowAlpha Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3AnimatableTb4b4b4(T79c0ff0fTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3coroutineScope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3capturedColorScheme Tff7b72= Te6edf3colorScheme T8b949e// Capture current colorScheme instance for LaunchedEffect

Tff7b72val Te6edf3sendColor Tff7b72= Te6edf3capturedColorSchemeTb4b4b4.Te6edf3StatusGreen
Tff7b72val Te6edf3receiveColor Tff7b72= Te6edf3capturedColorSchemeTb4b4b4.Te6edf3StatusBlue
Te6edf3LaunchedEffectTb4b4b4(Te6edf3uIViewModelTb4b4b4.Te6edf3meshActivityTb4b4b4, Te6edf3capturedColorSchemeTb4b4b4) Tb4b4b4{
Te6edf3uIViewModelTb4b4b4.Te6edf3meshActivityTb4b4b4.Te6edf3collectLatest Tb4b4b4{ Te6edf3activity Tff7b72-Tff7b72>
Tff7b72val Te6edf3newTargetColor Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3activityTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3MeshActivityTb4b4b4.Te6edf3Send Tff7b72-Tff7b72> Te6edf3sendColor
Tff7b72is Te6edf3MeshActivityTb4b4b4.Te6edf3Receive Tff7b72-Tff7b72> Te6edf3receiveColor
Tb4b4b4}

Te6edf3currentGlowColor Tff7b72= Te6edf3newTargetColor
T8b949e// Stop any existing animation and launch a new one.
T8b949e// Launching in a new coroutine ensures the collect block is not suspended.
Te6edf3coroutineScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3animatedGlowAlphaTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4) T8b949e// Stop before snapping/animating
Te6edf3animatedGlowAlphaTb4b4b4.Te6edf3snapToTb4b4b4(T79c0ff1.0fTb4b4b4) T8b949e// Show glow instantly
Te6edf3animatedGlowAlphaTb4b4b4.Te6edf3animateToTb4b4b4(
Te6edf3targetValue Tff7b72= T79c0ff0.0fTb4b4b4, T8b949e// Fade out
Te6edf3animationSpec Tff7b72= Te6edf3tweenTb4b4b4(Te6edf3durationMillis Tff7b72= T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4, Te6edf3easing Tff7b72= Te6edf3LinearEasingTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3NavigationSuiteScaffoldTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3navigationSuiteItems Tff7b72= Tb4b4b4{
Te6edf3TopLevelDestinationTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3destination Tff7b72-Tff7b72>
Tff7b72val Te6edf3isSelected Tff7b72= Te6edf3destination Tff7b72=Tff7b72= Te6edf3topLevelDestination
Tff7b72val Te6edf3isConnectionsRoute Tff7b72= Te6edf3destination Tff7b72=Tff7b72= Te6edf3TopLevelDestinationTb4b4b4.Te6edf3Connections
Te6edf3itemTb4b4b4(
Te6edf3icon Tff7b72= Tb4b4b4{
Te6edf3TooltipBoxTb4b4b4(
Te6edf3positionProvider Tff7b72=
Te6edf3TooltipDefaultsTb4b4b4.Te6edf3rememberTooltipPositionProviderTb4b4b4(Te6edf3TooltipAnchorPositionTb4b4b4.Te6edf3AboveTb4b4b4)Tb4b4b4,
Te6edf3tooltip Tff7b72= Tb4b4b4{
Te6edf3PlainTooltip Tb4b4b4{
Te6edf3TextTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3isConnectionsRouteTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3connectionStateTb4b4b4) Tb4b4b4{
Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connectedTb4b4b4)
Te6edf3ConnectionStateTb4b4b4.Te6edf3Connecting Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connectingTb4b4b4)
Te6edf3ConnectionStateTb4b4b4.Te6edf3DeviceSleep Tff7b72-Tff7b72>
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_sleepingTb4b4b4)
Te6edf3ConnectionStateTb4b4b4.Te6edf3Disconnected Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3disconnectedTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3destinationTb4b4b4.Te6edf3labelTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3state Tff7b72= Te6edf3rememberTooltipStateTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isConnectionsRouteTb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3drawWithCache Tb4b4b4{
Te6edf3onDrawWithContent Tb4b4b4{
Te6edf3drawContentTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3animatedGlowAlphaTb4b4b4.Te6edf3value Tff7b72> T79c0ff0fTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3glowRadius Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3minDimension
Te6edf3drawCircleTb4b4b4(
Te6edf3brush Tff7b72=
Te6edf3BrushTb4b4b4.Te6edf3radialGradientTb4b4b4(
Te6edf3colors Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3currentGlowColorTb4b4b4.Te6edf3copyTb4b4b4(
Te6edf3alpha Tff7b72= T79c0ff0.8f Tff7b72* Te6edf3animatedGlowAlphaTb4b4b4.Te6edf3valueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3currentGlowColorTb4b4b4.Te6edf3copyTb4b4b4(
Te6edf3alpha Tff7b72= T79c0ff0.4f Tff7b72* Te6edf3animatedGlowAlphaTb4b4b4.Te6edf3valueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3ColorTb4b4b4.Te6edf3TransparentTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3center Tff7b72= Te6edf3centerTb4b4b4,
Te6edf3radius Tff7b72= Te6edf3glowRadiusTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3radius Tff7b72= Te6edf3glowRadiusTb4b4b4,
Te6edf3blendMode Tff7b72= Te6edf3BlendModeTb4b4b4.Te6edf3ScreenTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ConnectionsNavIconTb4b4b4(
Te6edf3connectionState Tff7b72= Te6edf3connectionStateTb4b4b4,
Te6edf3deviceType Tff7b72= Te6edf3DeviceTypeTb4b4b4.Te6edf3fromAddressTb4b4b4(Te6edf3selectedDeviceTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3BadgedBoxTb4b4b4(
Te6edf3badge Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3destination Tff7b72=Tff7b72= Te6edf3TopLevelDestinationTb4b4b4.Te6edf3ConversationsTb4b4b4) Tb4b4b4{
T8b949e// Keep track of the last non-zero count for display during exit animation
Tff7b72var Te6edf3lastNonZeroCount Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableIntStateOfTb4b4b4(Te6edf3unreadMessageCountTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3unreadMessageCount Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3lastNonZeroCount Tff7b72= Te6edf3unreadMessageCount
Tb4b4b4}
Te6edf3AnimatedVisibilityTb4b4b4(
Te6edf3visible Tff7b72= Te6edf3unreadMessageCount Tff7b72> T79c0ff0Tb4b4b4,
Te6edf3enter Tff7b72= Te6edf3scaleInTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3fadeInTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3exit Tff7b72= Te6edf3scaleOutTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3fadeOutTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3Badge Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3lastNonZeroCountTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3destinationTb4b4b4.Te6edf3iconTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3destinationTb4b4b4.Te6edf3labelTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3LocalContentColorTb4b4b4.Te6edf3currentTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3selected Tff7b72= Te6edf3isSelectedTb4b4b4,
Te6edf3label Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3navSuiteType Tff7b72!Tff7b72= Te6edf3NavigationSuiteTypeTb4b4b4.Te6edf3ShortNavigationBarCompactTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3destinationTb4b4b4.Te6edf3labelTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3isRepress Tff7b72= Te6edf3destination Tff7b72=Tff7b72= Te6edf3topLevelDestination
Tff7b72if Tb4b4b4(Te6edf3isRepressTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3destinationTb4b4b4) Tb4b4b4{
Te6edf3TopLevelDestinationTb4b4b4.Te6edf3Nodes Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3onNodesList Tff7b72= Te6edf3currentDestinationTff7b72?.Te6edf3hasRouteTb4b4b4(Te6edf3NodesRoutesTb4b4b4.Te6edf3NodesTff7b72::Te6edf3classTb4b4b4) Tff7b72=Tff7b72= Tff7b72true
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3onNodesListTb4b4b4) Tb4b4b4{
Te6edf3navControllerTb4b4b4.Te6edf3navigateTb4b4b4(Te6edf3destinationTb4b4b4.Te6edf3routeTb4b4b4) Tb4b4b4{
Te6edf3popUpToTb4b4b4(Te6edf3navControllerTb4b4b4.Te6edf3graphTb4b4b4.Te6edf3findStartDestinationTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{ Te6edf3saveState Tff7b72= Tff7b72true Tb4b4b4}
Te6edf3launchSingleTop Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}
Te6edf3uIViewModelTb4b4b4.Te6edf3emitScrollToTopEventTb4b4b4(Te6edf3ScrollToTopEventTb4b4b4.Te6edf3NodesTabPressedTb4b4b4)
Tb4b4b4}
Te6edf3TopLevelDestinationTb4b4b4.Te6edf3Conversations Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3onConversationsList Tff7b72=
Te6edf3currentDestinationTff7b72?.Te6edf3hasRouteTb4b4b4(Te6edf3ContactsRoutesTb4b4b4.Te6edf3ContactsTff7b72::Te6edf3classTb4b4b4) Tff7b72=Tff7b72= Tff7b72true
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3onConversationsListTb4b4b4) Tb4b4b4{
Te6edf3navControllerTb4b4b4.Te6edf3navigateTb4b4b4(Te6edf3destinationTb4b4b4.Te6edf3routeTb4b4b4) Tb4b4b4{
Te6edf3popUpToTb4b4b4(Te6edf3navControllerTb4b4b4.Te6edf3graphTb4b4b4.Te6edf3findStartDestinationTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{ Te6edf3saveState Tff7b72= Tff7b72true Tb4b4b4}
Te6edf3launchSingleTop Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}
Te6edf3uIViewModelTb4b4b4.Te6edf3emitScrollToTopEventTb4b4b4(Te6edf3ScrollToTopEventTb4b4b4.Te6edf3ConversationsTabPressedTb4b4b4)
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3navControllerTb4b4b4.Te6edf3navigateTb4b4b4(Te6edf3destinationTb4b4b4.Te6edf3routeTb4b4b4) Tb4b4b4{
Te6edf3popUpToTb4b4b4(Te6edf3navControllerTb4b4b4.Te6edf3graphTb4b4b4.Te6edf3findStartDestinationTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{ Te6edf3saveState Tff7b72= Tff7b72true Tb4b4b4}
Te6edf3launchSingleTop Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3NavHostTb4b4b4(
Te6edf3navController Tff7b72= Te6edf3navControllerTb4b4b4,
Te6edf3startDestination Tff7b72= Te6edf3NodesRoutesTb4b4b4.Te6edf3NodesGraphTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3recalculateWindowInsetsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3safeDrawingPaddingTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3imePaddingTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3contactsGraphTb4b4b4(Te6edf3navControllerTb4b4b4, Te6edf3uIViewModelTb4b4b4.Te6edf3scrollToTopEventFlowTb4b4b4)
Te6edf3nodesGraphTb4b4b4(Te6edf3navControllerTb4b4b4, Te6edf3uIViewModelTb4b4b4.Te6edf3scrollToTopEventFlowTb4b4b4)
Te6edf3mapGraphTb4b4b4(Te6edf3navControllerTb4b4b4)
Te6edf3channelsGraphTb4b4b4(Te6edf3navControllerTb4b4b4)
Te6edf3connectionsGraphTb4b4b4(Te6edf3navControllerTb4b4b4)
Te6edf3settingsGraphTb4b4b4(Te6edf3navControllerTb4b4b4)
Te6edf3firmwareGraphTb4b4b4(Te6edf3navControllerTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffVersionChecksTb4b4b4(Te6edf3viewModelTb4b4b4: Te6edf3UIViewModelTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3connectionState Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3myNodeInfo Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3myNodeInfoTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3context Tff7b72= Te6edf3LocalContextTb4b4b4.Te6edf3current

Tff7b72val Te6edf3myFirmwareVersion Tff7b72= Te6edf3myNodeInfoTff7b72?.Te6edf3firmwareVersion

Tff7b72val Te6edf3firmwareEdition Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3firmwareEditionTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tff7b72nullTb4b4b4)

Tff7b72val Te6edf3latestStableFirmwareRelease Tff7b72by
Te6edf3viewModelTb4b4b4.Te6edf3latestStableFirmwareReleaseTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Te6edf3DeviceVersionTb4b4b4(Ta5d6ff"Ta5d6ff2.6.4Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Te6edf3connectionStateTb4b4b4, Te6edf3firmwareEditionTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3connectionState Tff7b72=Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4{
Te6edf3firmwareEditionTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3edition Tff7b72-Tff7b72>
Te6edf3TimberTb4b4b4.Te6edf3dTb4b4b4(Ta5d6ff"Ta5d6ffFirmwareEdition: Tffd700${Te6edf3editionTb4b4b4.Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72when Tb4b4b4(Te6edf3editionTb4b4b4) Tb4b4b4{
Te6edf3MeshProtosTb4b4b4.Te6edf3FirmwareEditionTb4b4b4.Te6edf3VANILLA Tff7b72-Tff7b72> Tb4b4b4{
T8b949e// Handle any specific logic for VANILLA firmware edition if needed
Tb4b4b4}

Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
T8b949e// Handle other firmware editions if needed
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e// Check if the device is running an old app version or firmware version
Te6edf3LaunchedEffectTb4b4b4(Te6edf3connectionStateTb4b4b4, Te6edf3myNodeInfoTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3connectionState Tff7b72=Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4{
Te6edf3myNodeInfoTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3info Tff7b72-Tff7b72>
Tff7b72val Te6edf3isOld Tff7b72= Te6edf3infoTb4b4b4.Te6edf3minAppVersion Tff7b72> Te6edf3BuildConfigTb4b4b4.Te6edf3VERSION_CODE Tff7b72&Tff7b72& Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4.Te6edf3notTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3isOldTb4b4b4) Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3showAlertTb4b4b4(
Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3app_too_oldTb4b4b4)Tb4b4b4,
Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3must_updateTb4b4b4)Tb4b4b4,
Te6edf3dismissable Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3service Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3meshService Tff7b72?: Tff7b72returnTf0883e@showAlert
Te6edf3MeshServiceTb4b4b4.Te6edf3changeDeviceAddressTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3serviceTb4b4b4, Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3myFirmwareVersionTff7b72?.Te6edf3let Tb4b4b4{
Tff7b72val Te6edf3curVer Tff7b72= Te6edf3DeviceVersionTb4b4b4(Tffa657itTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3curVer Tff7b72< Te6edf3MeshServiceTb4b4b4.Te6edf3absoluteMinDeviceVersionTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3title Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_too_oldTb4b4b4)
Tff7b72val Te6edf3message Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_oldTb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3showAlertTb4b4b4(
Te6edf3title Tff7b72= Te6edf3titleTb4b4b4,
Te6edf3html Tff7b72= Te6edf3messageTb4b4b4,
Te6edf3dismissable Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3service Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3meshService Tff7b72?: Tff7b72returnTf0883e@showAlert
Te6edf3MeshServiceTb4b4b4.Te6edf3changeDeviceAddressTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3serviceTb4b4b4, Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3curVer Tff7b72< Te6edf3MeshServiceTb4b4b4.Te6edf3minDeviceVersionTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3title Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3should_update_firmwareTb4b4b4)
Tff7b72val Te6edf3message Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3should_updateTb4b4b4, Te6edf3latestStableFirmwareReleaseTb4b4b4.Te6edf3asStringTb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3showAlertTb4b4b4(Te6edf3title Tff7b72= Te6edf3titleTb4b4b4, Te6edf3message Tff7b72= Te6edf3messageTb4b4b4, Te6edf3dismissable Tff7b72= Tff7b72falseTb4b4b4, Te6edf3onConfirm Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.14s